/**
 * 
 */
package com.cplsystems.incidencias.vm.personal;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.zkoss.bind.BindContext;
import org.zkoss.bind.BindUtils;
import org.zkoss.bind.annotation.BindingParam;
import org.zkoss.bind.annotation.Command;
import org.zkoss.bind.annotation.ContextParam;
import org.zkoss.bind.annotation.ContextType;
import org.zkoss.bind.annotation.GlobalCommand;
import org.zkoss.bind.annotation.Init;
import org.zkoss.bind.annotation.NotifyChange;
import org.zkoss.image.Image;
import org.zkoss.io.Files;
import org.zkoss.util.media.Media;
import org.zkoss.zk.ui.event.Event;
import org.zkoss.zk.ui.event.EventListener;
import org.zkoss.zk.ui.event.UploadEvent;
import org.zkoss.zk.ui.select.annotation.VariableResolver;
import org.zkoss.zk.ui.util.Clients;
import org.zkoss.zul.Filedownload;
import org.zkoss.zul.Messagebox;
import org.zkoss.zul.Window;

import com.cplsystems.incidencias.app.utils.ImageUtils;
import com.cplsystems.incidencias.app.utils.IncidenciasConstants;
import com.cplsystems.incidencias.app.utils.IncidenciasUtils;
import com.cplsystems.incidencias.business.DatosAcademicos;
import com.cplsystems.incidencias.business.DatosGenerales;
import com.cplsystems.incidencias.business.DependenciasEconomicas;
import com.cplsystems.incidencias.business.Documentacion;
import com.cplsystems.incidencias.business.ExperienciaLaboral;
import com.cplsystems.incidencias.business.Organizacion;
import com.cplsystems.incidencias.business.OrganizacionPersonal;
import com.cplsystems.incidencias.business.ReferenciasPersonales;
import com.cplsystems.incidencias.business.Transaccion;
import com.cplsystems.incidencias.vm.personal.utils.PersonalVariables;

/**
 * @author César Palalía López (csr.plz@aisa-automation.com)
 * 
 */
@VariableResolver(org.zkoss.zkplus.spring.DelegatingVariableResolver.class)
public class PersonalVM extends PersonalVariables {

	private static final long serialVersionUID = 3210379013135306247L;

	@Init
	public void init() {
		super.init();
	}

	@SuppressWarnings("unused")
	@Command
	public void uploadProfilePicture(
			@ContextParam(ContextType.BIND_CONTEXT) final BindContext ctx) {
		
		UploadEvent event = (UploadEvent) ctx.getTriggerEvent();
		Media media = event.getMedia();
		File myFile = new File(media.getName());
		if (myFile == null) {
			IncidenciasUtils.showMessage("El archivo seleccionado no pudo ser "
					+ "cargado correctamente, por favor "
					+ "inténtelo nuevamente", Clients.NOTIFICATION_TYPE_ERROR,
					4000);

			return;
		} else {
			try {
				Files.copy(new File(IncidenciasConstants.CARPETA_DATOS_ORGANIZACIONALES_TRABAJADOR 
						+ " " + datosGenerales.getApellidoPaterno() 
						+ " " + datosGenerales.getApellidoMaterno() 
						+ " " + datosGenerales.getNombre() 
						+ " Infonavit" + media.getName()),
						media.getStreamData());
				myFile = new File(IncidenciasConstants.CARPETA_DATOS_ORGANIZACIONALES_TRABAJADOR 
						+ " " + datosGenerales.getApellidoPaterno() 
						+ " " + datosGenerales.getApellidoMaterno() 
						+ " " + datosGenerales.getNombre()
						+ " Infonavit" + media.getName());
			} catch (IOException e) {
				e.printStackTrace();
			}
			datosOrganizacionales.setDocumentoInfonavit(myFile.getAbsolutePath());
			persona.setImagen(myFile.getAbsolutePath());
			
			IncidenciasUtils.showMessage("Archivo cargado correctamente",
					Clients.NOTIFICATION_TYPE_INFO, 2000);
		}
		
		
		/*
		UploadEvent event = (UploadEvent) ctx.getTriggerEvent();
		Media media = event.getMedia();
		
		Image imageRetrieved = (Image) media;
		byte[] data = media.getByteData();
		if (data == null) {
			IncidenciasUtils.showMessage("El archivo seleccionado no pudo ser "
					+ "cargado correctamente, por favor "
					+ "inténtelo nuevamente", Clients.NOTIFICATION_TYPE_ERROR,
					4000);

			return;
		} else {
			try {
				imageFormat = imageRetrieved.getFormat();
				File perfilPictureFile = new File("C://"
						+ Calendar.getInstance().getTime().toString() + ".png");
				FileOutputStream fos = new FileOutputStream(perfilPictureFile);
				fos.write(imageInBytes);
				fos.close();
				persona.setImagen(perfilPictureFile.getPath());
				pictureProfil = ImageUtils.scaleToSize(imageInBytes, 250, 400,
						imageFormat).getContent();
				IncidenciasUtils.showMessage("Archivo cargado correctamente",
						Clients.NOTIFICATION_TYPE_INFO, 2000);
			} catch (Exception e) {
				e.printStackTrace();
			}
		}*/
	}
	
	@Command
	public void downloadProfilePicture(){
		if(persona != null && (persona.getImagen() != null && !persona.getImagen().isEmpty())){
			try {
				Filedownload.save(new File(persona.getImagen()),
						null);
			} catch (FileNotFoundException e) {
				IncidenciasUtils.showMessage(
						"El archivo no puede ser descargado ya que aparantemente "
								+ "no fué encontrado en la ruta especificada",
						Clients.NOTIFICATION_TYPE_WARNING, 0);
			}
		}
	}

	@Command
	@NotifyChange({ "listaDatosAcademicos", "newDatoAcademico",
			"nivelAcademicoSeleccionado", "statusSeleccionado" })
	public void agregarCurso() {
		if (newDatoAcademico != null) {
			if (newDatoAcademico.getIdDatosAcademicos() == null
					&& !listaDatosAcademicos.contains(newDatoAcademico)) {
				if (nivelAcademicoSeleccionado.getIdniveAcademico() == null
						|| newDatoAcademico.getAnioInicio() == null
						|| newDatoAcademico.getAnioFin() == null
						|| newDatoAcademico.getEspecialidad() == null
						|| newDatoAcademico.getEspecialidad().isEmpty()
						|| newDatoAcademico.getInstitucion() == null
						|| newDatoAcademico.getInstitucion().isEmpty()
						|| statusSeleccionado.getIdStatus() == null) {
					IncidenciasUtils
							.showMessage(
									"Para agregar un nuevo curso, por favor verifique "
											+ "que la información  marcada como requerida (*) "
											+ "este completa",
									Clients.NOTIFICATION_TYPE_WARNING, 0);
					return;
				}
				newDatoAcademico.setNivelacademico(nivelAcademicoSeleccionado);
				newDatoAcademico.setStatus(statusSeleccionado);
				newDatoAcademico.setPersona(persona);
				listaDatosAcademicos.add(newDatoAcademico);
			} else {
				newDatoAcademico.setNivelacademico(nivelAcademicoSeleccionado);
				newDatoAcademico.setStatus(statusSeleccionado);
			}
			newDatoAcademico = new DatosAcademicos();
			nivelAcademicoSeleccionado = nivelesAcademicosCatalogo.get(0);
			statusSeleccionado = statusCatalogo.get(0);
		}
	}

	@Command
	@NotifyChange({ "listaDatosAcademicos", "newDatoAcademico",
			"nivelAcademicoSeleccionado", "statusSeleccionado" })
	public void removerCurso() {
		if (listaDatosAcademicos.contains(datoAcademicoSeleccionado)) {
			listaDatosAcademicos.remove(datoAcademicoSeleccionado);

			newDatoAcademico = new DatosAcademicos();
			nivelAcademicoSeleccionado = nivelesAcademicosCatalogo.get(0);
			statusSeleccionado = statusCatalogo.get(0);

		} else {
			IncidenciasUtils
					.showMessage(
							"Por favor seleccione el curso a remover, "
									+ "tenga en cuenta que esta acción es irreversible",
							Clients.NOTIFICATION_TYPE_WARNING, 4500);
		}
	}

	@Command
	@NotifyChange({ "listaDatosAcademicos", "newDatoAcademico",
			"nivelAcademicoSeleccionado", "statusSeleccionado" })
	public void prepareElementForEdition(@BindingParam("index") Integer index) {
		if (index != null) {
			if (newDatoAcademico == null) {
				newDatoAcademico = new DatosAcademicos();
			}
			newDatoAcademico = listaDatosAcademicos.get(index.intValue());
			statusSeleccionado = newDatoAcademico.getStatus();
			nivelAcademicoSeleccionado = newDatoAcademico.getNivelacademico();
		}
	}

	@Command
	@NotifyChange({ "listaDocumentos", "nuevoDocumento",
			"tipoDocumentoSeleccionado" })
	public void agregarDocumento() {
		if (nuevoDocumento != null) {
			if (newDatoAcademico.getIdDatosAcademicos() == null
					&& !listaDocumentos.contains(nuevoDocumento)) {
				if (nuevoDocumento.getPath() == null
						|| nuevoDocumento.getPath().isEmpty()) {
					IncidenciasUtils.showMessage(
							"Para registrar un documento es necesario que se"
									+ " haya anexado algún archivo ",
							Clients.NOTIFICATION_TYPE_ERROR, 4000);

					return;
				}
				nuevoDocumento.setPersona(persona);
				nuevoDocumento.setDocumento(tipoDocumentoSeleccionado);
				listaDocumentos.add(nuevoDocumento);
			} else {
				nuevoDocumento.setDocumento(tipoDocumentoSeleccionado);
			}
			nuevoDocumento = new Documentacion();
			tipoDocumentoSeleccionado = catalogoTipoDocumento.get(0);
		}
	}

	@SuppressWarnings("unused")
	@Command
	@NotifyChange({ "nuevoDocumento" })
	public void uploadDocumento(
			@ContextParam(ContextType.BIND_CONTEXT) final BindContext ctx) {
		UploadEvent event = (UploadEvent) ctx.getTriggerEvent();
		Media media = event.getMedia();/*
										 * if (!media.getFormat().toUpperCase().
										 * contains("PDF")) { Messagebox.show(
										 * "El archivo seleccionado no es un archivo válido"
										 * , "Error", Messagebox.OK,
										 * Messagebox.ERROR); return; }
										 */
		File myFile = new File(media.getName());
		if (myFile == null) {
			IncidenciasUtils.showMessage("El archivo seleccionado no pudo ser "
					+ "cargado correctamente, por favor "
					+ "inténtelo nuevamente", Clients.NOTIFICATION_TYPE_ERROR,
					4000);

			return;
		} else {
			try {
				Files.copy(new File(IncidenciasConstants.CARPETA_DOCUMENTOS_TRABAJADOR 
						+ datosGenerales.getApellidoPaterno() + datosGenerales.getApellidoMaterno() + datosGenerales.getNombre() 
						+ tipoDocumentoSeleccionado + media.getName()),
						media.getStreamData());
				myFile = new File(IncidenciasConstants.CARPETA_DOCUMENTOS_TRABAJADOR 
						+ datosGenerales.getApellidoPaterno() + datosGenerales.getApellidoMaterno() + datosGenerales.getNombre() 
						+ tipoDocumentoSeleccionado + media.getName());
			} catch (IOException e) {
				e.printStackTrace();
			}
			nuevoDocumento.setPath(myFile.getAbsolutePath());
			nuevoDocumento.setDocumento(tipoDocumentoSeleccionado);
			IncidenciasUtils.showMessage("Archivo cargado correctamente",
					Clients.NOTIFICATION_TYPE_INFO, 2000);
		}
		// proveedor.setContratoPDF(binaryUtil.toWrapperArray(data));
	}

	@Command
	@NotifyChange({ "nuevoDocumento", "tipoDocumentoSeleccionado" })
	public void prepareDocumentForEdition(@BindingParam("index") Integer index) {
		if (index != null) {
			if (nuevoDocumento == null) {
				nuevoDocumento = new Documentacion();
			}
			nuevoDocumento = listaDocumentos.get(index.intValue());
			tipoDocumentoSeleccionado = nuevoDocumento.getDocumento();
		}
	}

	@Command
	@NotifyChange({ "listaDocumentos", "nuevoDocumento",
			"tipoDocumentoSeleccionado" })
	public void removerDocumento() {
		if (listaDocumentos.contains(documentacionSeleccionada)) {
			listaDocumentos.remove(documentacionSeleccionada);

			nuevoDocumento = new Documentacion();
			tipoDocumentoSeleccionado = catalogoTipoDocumento.get(0);
			
			Documentacion documentoRemove = documentacionService.getById(documentacionSeleccionada.getIdDocumentacion());
			if(documentoRemove != null)
				documentacionService.delete(documentoRemove);
		} else {
			IncidenciasUtils
					.showMessage(
							"Por favor seleccione el documento a remover, "
									+ "tenga en cuenta que esta acción es irreversible",
							Clients.NOTIFICATION_TYPE_WARNING, 4500);
		}
	}

	@Command
	public void descargarDocumento(@BindingParam("index") Integer index) {
		if (index == null) {
			return;
		}
		documentacionSeleccionada = listaDocumentos.get(index.intValue());
		try {
			Filedownload.save(new File(documentacionSeleccionada.getPath()),
					null);
		} catch (FileNotFoundException e) {
			IncidenciasUtils.showMessage(
					"El archivo no puede ser descargado ya que aparantemente "
							+ "no fué encontrado en la ruta especificada",
					Clients.NOTIFICATION_TYPE_WARNING, 0);
		}
	}

	// DOCUMENTOS CALIDAD
	@Command
	@NotifyChange({ "listaDocumentos", "nuevoDocumento",
			"tipoDocumentoSeleccionado" })
	public void agregarDocumentoCalidad() {
		if (nuevoDocumento != null) {
			if (newDatoAcademico.getIdDatosAcademicos() == null
					&& !listaDocumentos.contains(nuevoDocumento)) {
				if (nuevoDocumento.getPath() == null
						|| nuevoDocumento.getPath().isEmpty()) {
					IncidenciasUtils.showMessage(
							"Para registrar un documento es necesario que se"
									+ " haya anexado algún archivo ",
							Clients.NOTIFICATION_TYPE_ERROR, 4000);

					return;
				}
				nuevoDocumento.setDocumento(tipoDocumentoSeleccionado);
				listaDocumentos.add(nuevoDocumento);
			} else {
				nuevoDocumento.setDocumento(tipoDocumentoSeleccionado);
			}
			nuevoDocumento = new Documentacion();
			tipoDocumentoSeleccionado = catalogoTipoDocumento.get(0);
		}
	}

	@SuppressWarnings("unused")
	@Command
	@NotifyChange({ "nuevoDocumento" })
	public void uploadDocumentoCalidad(
			@ContextParam(ContextType.BIND_CONTEXT) final BindContext ctx) {
		UploadEvent event = (UploadEvent) ctx.getTriggerEvent();
		Media media = event.getMedia();/*
										 * if (!media.getFormat().toUpperCase().
										 * contains("PDF")) { Messagebox.show(
										 * "El archivo seleccionado no es un archivo válido"
										 * , "Error", Messagebox.OK,
										 * Messagebox.ERROR); return; }
										 */
		File myFile = new File(media.getName());
		if (myFile == null) {
			IncidenciasUtils.showMessage("El archivo seleccionado no pudo ser "
					+ "cargado correctamente, por favor "
					+ "inténtelo nuevamente", Clients.NOTIFICATION_TYPE_ERROR,
					4000);

			return;
		} else {
			nuevoDocumento.setPath(myFile.getAbsolutePath());
			nuevoDocumento.setDocumento(tipoDocumentoSeleccionado);
			IncidenciasUtils.showMessage("Archivo cargado correctamente",
					Clients.NOTIFICATION_TYPE_INFO, 2000);
		}
		// proveedor.setContratoPDF(binaryUtil.toWrapperArray(data));
	}

	@Command
	@NotifyChange({ "nuevoDocumento", "tipoDocumentoSeleccionado" })
	public void prepareDocumentoCalidadForEdition(
			@BindingParam("index") Integer index) {
		if (index != null) {
			if (nuevoDocumento == null) {
				nuevoDocumento = new Documentacion();
			}
			nuevoDocumento = listaDocumentos.get(index.intValue());
			tipoDocumentoSeleccionado = nuevoDocumento.getDocumento();
		}
	}

	@Command
	@NotifyChange({ "listaDocumentos", "nuevoDocumento",
			"tipoDocumentoSeleccionado" })
	public void removerDocumentoCalidad() {
		if (listaDocumentos.contains(documentacionSeleccionada)) {
			listaDocumentos.remove(documentacionSeleccionada);

			nuevoDocumento = new Documentacion();
			tipoDocumentoSeleccionado = catalogoTipoDocumento.get(0);
		} else {
			IncidenciasUtils
					.showMessage(
							"Por favor seleccione el documento a remover, "
									+ "tenga en cuenta que esta acción es irreversible",
							Clients.NOTIFICATION_TYPE_WARNING, 4500);
		}
	}

	@Command
	public void descargarDocumentoCalidad(@BindingParam("index") Integer index) {
		if (index == null) {
			return;
		}
		documentacionSeleccionada = listaDocumentos.get(index.intValue());
		try {
			Filedownload.save(new File(documentacionSeleccionada.getPath()),
					null);
		} catch (FileNotFoundException e) {
			IncidenciasUtils.showMessage(
					"El archivo no puede ser descargado ya que aparantemente "
							+ "no fué encontrado en la ruta especificada",
					Clients.NOTIFICATION_TYPE_WARNING, 0);
		}
	}

	@Command
	@NotifyChange("municipios")
	public void getMunicipiosByEstado() {
		municipios = municipioService.getMunicipioByEstado(estadoSeleccionado);
		municipioSeleccionado = municipios.get(0);
	}

	@Command
	public void mostrarDependientesEconomicos() {
		Map<String, Object> dependientes = new HashMap<String, Object>();
		dependientes.put("dependenciasEconomicas", dependenciasEconomicas);
		Window dependenciasView = incidenciasUtils.createModelDialogWithParams(
				IncidenciasConstants.MODAL_VIEW_DEPENDIENTES_ECONOMICOS,
				dependientes);
		dependenciasView.doModal();
	}

	@Command
	public void mostrarReferenciasPersonales() {
		Map<String, Object> referencias = new HashMap<String, Object>();
		referencias.put("referenciasPersonales", referenciasPersonales);
		Window referenciasView = incidenciasUtils.createModelDialogWithParams(
				IncidenciasConstants.MODAL_VIEW_REFERENCIAS_PERSONALES,
				referencias);
		referenciasView.doModal();
	}

	@Command
	@NotifyChange({ "nuevaExperienciaLaboral", "experienciasLaborales" })
	public void agregarExperienciaLaboral() {
		if (nuevaExperienciaLaboral != null) {
			if (!experienciasLaborales.contains(nuevaExperienciaLaboral)) {
				nuevaExperienciaLaboral.setPersona(persona);
				if (nuevaExperienciaLaboral.getEmpresa() == null
						|| nuevaExperienciaLaboral.getEmpresa().isEmpty()
						|| nuevaExperienciaLaboral.getArea() == null
						|| nuevaExperienciaLaboral.getArea().isEmpty()
						|| nuevaExperienciaLaboral.getResponsabilidades() == null
						|| nuevaExperienciaLaboral.getResponsabilidades()
								.isEmpty()
						|| nuevaExperienciaLaboral.getMotivoSalida() == null
						|| nuevaExperienciaLaboral.getMotivoSalida().isEmpty()) {
					IncidenciasUtils.showMessage(
							"Asegurese de que los campos marcados como obligatorios (*) "
									+ "contengan información válida",
							Clients.NOTIFICATION_TYPE_WARNING, 4500);
					return;
				}
				experienciasLaborales.add(nuevaExperienciaLaboral);
			}
			nuevaExperienciaLaboral = new ExperienciaLaboral();
		}
	}

	@Command
	@NotifyChange({ "nuevaExperienciaLaboral", "experienciasLaborales" })
	public void removerExperienciaLaboral() {
		if (nuevaExperienciaLaboral != null) {
			if (experienciasLaborales.contains(nuevaExperienciaLaboral)) {
				experienciasLaborales.remove(nuevaExperienciaLaboral);
				nuevaExperienciaLaboral = new ExperienciaLaboral();
			}
		} else {
			IncidenciasUtils.showMessage("Por favor seleccione un elemento, "
					+ "tenga encuenta que est acción es irreversible",
					Clients.NOTIFICATION_TYPE_WARNING, 4000);
		}
	}

	@Command
	@NotifyChange({ "experienciasLaborales", "nuevaExperienciaLaboral" })
	public void prepareExperienciaLaboralForEdition(
			@BindingParam("index") Integer index) {
		if (index != null) {
			if (nuevaExperienciaLaboral == null) {
				nuevaExperienciaLaboral = new ExperienciaLaboral();
			}
			nuevaExperienciaLaboral = experienciasLaborales.get(index
					.intValue());
		}
	}

	@Command
	@NotifyChange("*")
	public void nuevoRegistro() {
		super.init();
	}

	@Command
	@NotifyChange("*")
	public void deleteRegistro() {
		Messagebox.show(
				"¿Está seguro de eliminar de manera permanente a este empleado?."
						+ "Tenga encuenta que esta acción es irreversible",
				"Question", Messagebox.OK | Messagebox.CANCEL,
				Messagebox.QUESTION, new EventListener<Event>() {
					public void onEvent(Event event) throws Exception {
						if (((Integer) event.getData()).intValue() == Messagebox.OK) {
							System.err.println("Remover");
						}
					}
				});
	}

	@Command
	@NotifyChange("*")
	public void saveChanges() {
		Organizacion organizacion = (Organizacion) sessionUtils
				.getFromSession(IncidenciasUtils
						.encrypt(IncidenciasConstants.FIRMA));

		persona.setEstadocivil(estadoCivilSeleccionado);
		persona.setSexo(sexoSeleccionado);
		personaService.save(persona);

		domicilio.setMunicipio(municipioSeleccionado);
		domicilioService.save(domicilio);

		personaDomicilio.setDomicilio(domicilio);
		personaDomicilio.setPersona(persona);
		personaDomicilioService.save(personaDomicilio);

		Transaccion transaccion = new Transaccion();
		transaccion.setEmpleado(persona);
		transaccion.setOrganizacion(organizacion);
		transaccion.setFecha(new Date());

		if (organizacionPersonal == null
				|| organizacionPersonal.getIdSucursalPersonal() == null) {
			organizacionPersonal = new OrganizacionPersonal();
			organizacionPersonal.setOrganizacion(organizacion);
			organizacionPersonal.setPersona(persona);
			organizacionPersonalService.save(organizacionPersonal);
			GENERAR_TRANSACCION_ALTA_IMMS: {
				transaccion.setSubject(Transaccion.ALTA_IMSS);
				transaccionService.save(transaccion);
			}

		} else {
			GENERAR_TRANSACCION_BAJAS_IMMS: {
				if (datosOrganizacionales.getMarcarBaja()) {
					List<Transaccion> transacciones = transaccionService
							.getTransaccionesByEmpleado(persona);
					if (transacciones != null) {
						for (Transaccion transaction : transacciones) {
							transaccionService.delete(transaction);
						}
					}
					transaccion.setSubject(Transaccion.BAJA_IMSS);
					transaccionService.save(transaccion);
				}
			}

			GENERAR_TRANSACCION_CAMBIO_PERCEPCION_DIARIA: {
				if (datosOrganizacionales.getPercepcionDiarioOldValue() != datosOrganizacionales
						.getPercepcionMensual()) {
					List<Transaccion> transacciones = transaccionService
							.getTransaccionesByEmpleado(persona);
					if (transacciones != null) {
						for (Transaccion transaction : transacciones) {
							transaccionService.delete(transaction);
						}
					}
					transaccion.setSubject(Transaccion.CAMBIO_PERCEPCCIONES);
					transaccionService.save(transaccion);
				}
			}

		}

		datosGeneralesService.save(datosGenerales);
		datosPersonales.setTipoSangre(grupoSanguineoSeleccionado);
		datosPersonalesService.save(datosPersonales);

		datosOrganizacionales.setTipopersonal(tipoPersonalSeleccionado);
		datosOrganizacionales.setTiposueldo(tipoSueldoSeleccionado);
		datosOrganizacionales.setTiponomina(tipoNominaSeleccionada);
		datosOrganizacionales.setCategoria(categoriaSeleccionada);
		datosOrganizacionales.setFormapago(formaPagoSeleccionada);
		datosOrganizacionales.setBanco(bancoSeleccionado);
		datosOrganizacionales.setHorarioLaboral(horarioLaboralSeleccionado);

		datosOrganizacionalesService.save(datosOrganizacionales);

		for (DependenciasEconomicas dependencias : dependenciasEconomicas) {
			dependencias.setPersona(persona);
			dependenciaEconomicaService.save(dependencias);
		}

		for (DatosAcademicos datosAcademicos : listaDatosAcademicos) {
			datosAcademicos.setPersona(persona);
			datosAcademicosService.save(datosAcademicos);
		}

		for (Documentacion documentacion : listaDocumentos) {
			documentacion.setPersona(persona);
			documentacionService.save(documentacion);
		}
		for (ExperienciaLaboral experienciaLaboral : experienciasLaborales) {
			experienciaLaboral.setPersona(persona);
			experienciaLaboralService.save(experienciaLaboral);
		}
		for (ReferenciasPersonales referencias : referenciasPersonales) {
			referencias.setPersona(persona);
			referenciasPersonalesService.save(referencias);
		}

		super.init();
		BindUtils.postGlobalCommand(null, null, "updateTransacciones", null);
		IncidenciasUtils.showMessage(
				"Los datos se han actualizado correctamente",
				Clients.NOTIFICATION_TYPE_INFO, 3500);

	}

	@Command
	public void onCheckRepTiempo() {
		if (reporteTiempo.equalsIgnoreCase("Si")) {
			datosOrganizacionales.setReporteTiempo(true);
		} else {
			datosOrganizacionales.setReporteTiempo(false);
		}
	}

	@Command
	public void onCheckTarjetaTiempo() {
		if (tarjetaTiempo.equalsIgnoreCase("Si")) {
			datosOrganizacionales.setTarjetaTiempo(true);
		} else {
			datosOrganizacionales.setTarjetaTiempo(false);
		}
	}

	@Command
	public void marcarBaja() {
		if (datosOrganizacionales.getMarcarBaja() != null) {
			if (datosOrganizacionales.getMarcarBaja()) {
				Messagebox.show(
						"¿Está seguro de dar de baja a este empleado?.",
						"Question", Messagebox.OK | Messagebox.CANCEL,
						Messagebox.QUESTION, new EventListener<Event>() {
							public void onEvent(Event event) throws Exception {
								if (((Integer) event.getData()).intValue() == Messagebox.OK) {
									datosOrganizacionales.setMarcarBaja(true);
									datosOrganizacionales
											.setCausa(despidoSeleccionado);
								} else {
									datosOrganizacionales.setMarcarBaja(false);
									datosOrganizacionales.setCausa("");
								}
							}
						});
				BindUtils.postGlobalCommand(null, null, "refreshDatosOrganizacionales", null);
			} else {
				datosOrganizacionales.setCausa("");
			}
		}
	}

	@GlobalCommand
	@NotifyChange("datosOrganizacionales")
	public void refreshDatosOrganizacionales() {

	}

	@Command
	public void buscarPersona() {
		Window personalView = incidenciasUtils
				.createModelDialog(IncidenciasConstants.MODAL_VIEW_PERSONAL);
		personalView.doModal();
	}

	@GlobalCommand
	@NotifyChange("*")
	public void loadDatosPersona(
			@BindingParam("personaSeleccionada") DatosGenerales personaSeleccionada) {
		if (personaSeleccionada != null) {
			persona = personaSeleccionada.getPersona();
			datosGenerales = personaSeleccionada;
			estadoCivilSeleccionado = persona.getEstadocivil();
			sexoSeleccionado = persona.getSexo();

			organizacionPersonal = organizacionPersonalService
					.getOrganizacionByPersona(persona);

			personaDomicilio = personaDomicilioService.getByPersona(persona);
			domicilio = personaDomicilio.getDomicilio();
			municipioSeleccionado = domicilio.getMunicipio();
			estadoSeleccionado = municipioSeleccionado.getEstado();

			datosPersonales = datosPersonalesService
					.getDatosPersonalesByPersona(persona);
			grupoSanguineoSeleccionado = datosPersonales.getTipoSangre();
			listaDatosAcademicos = datosAcademicosService
					.getDatosAcademicosByPersoa(persona);

			listaDocumentos = documentacionService
					.getDocumentosByPersona(persona);
			dependenciasEconomicas = dependenciaEconomicaService
					.getDependenciasByPersona(persona);
			if (dependenciasEconomicas == null) {
				dependenciasEconomicas = new ArrayList<DependenciasEconomicas>();
			}

			referenciasPersonales = referenciasPersonalesService
					.getReferenciasByPersona(persona);
			if (referenciasPersonales == null) {
				referenciasPersonales = new ArrayList<ReferenciasPersonales>();
			}

			experienciasLaborales = experienciaLaboralService
					.getExperienciasByPersona(persona);
			if (experienciasLaborales == null) {
				experienciasLaborales = new ArrayList<ExperienciaLaboral>();
			}

			datosOrganizacionales = datosOrganizacionalesService
					.getDatosOrganizacionales(persona);
			tipoPersonalSeleccionado = datosOrganizacionales.getTipopersonal();
			tipoSueldoSeleccionado = datosOrganizacionales.getTiposueldo();
			tipoNominaSeleccionada = datosOrganizacionales.getTiponomina();
			categoriaSeleccionada = datosOrganizacionales.getCategoria();
			formaPagoSeleccionada = datosOrganizacionales.getFormapago();
			bancoSeleccionado = datosOrganizacionales.getBanco();
			horarioLaboralSeleccionado = datosOrganizacionales
					.getHorarioLaboral();
			reporteTiempo = !datosOrganizacionales.getReporteTiempo() ? "No"
					: "Si";
			tarjetaTiempo = !datosOrganizacionales.getTarjetaTiempo() ? "No"
					: "Si";
			datosOrganizacionales
					.setPercepcionDiarioOldValue(datosOrganizacionales
							.getPercepcionMensual());

		}
	}

	@Command
	protected void asignarSucursal() {
		if (sucursalSeleccionada != null) {

		}
	}

}
